#include <iostream> 
#include<time.h>
#include <signal.h>
using namespace std;


// Global Signal Flag
volatile sig_atomic_t sig_received = 0;

void signal_callback_handler(int signum)
{
   sig_received=signum;
   write(2,  "Caught signal\n",  14); 
} 

int main()
{
  std::cout << getpid() << std::endl;
  //Prepare for nanosleep
  int millisec = 1000;
  struct timespec req = {0};
  req.tv_sec = 0;
  req.tv_nsec = millisec * 1000000L;

  //Register signal handlers
  signal(SIGINT, signal_callback_handler);
  signal(SIGTERM,signal_callback_handler);
  signal(SIGQUIT,signal_callback_handler);

  while(sig_received == 0){
    nanosleep(&req, (struct timespec *)NULL);
  }
  std::cout << "App received "<<sig_received<<" . EXITING"<<std::endl;
}

/*


Danach verf¨allt es in eine Schleife, die solange durchlaufen
wird, bis eine Abbruchbedingung (angezeigt durch ein globales
Flag) erf¨ullt ist. Ein Schleifendurchlauf l¨asst das Programm
eine Sekunde schlafen (→ man  nanosleep).
I Die Abbruchbedingung — das globale Flag — wird durch
einen Signal Handler gesetzt, der die Signale SIGTERM,
SIGINT und SIGQUIT.
I Jedes Ereignis wird mit einer Ausgabe auf Standard Error
quittiert. Vorsicht: im Signal Handler nur async-signal-safe
Funktionen verwenden (man  2  write)!
*/
